package com.example.petcare.service.serviceImpl;

import com.example.petcare.exception.OrderException;
import com.example.petcare.mapper.OrderMapper;
import com.example.petcare.pojo.HostDemand;
import com.example.petcare.pojo.PageBean;
import com.example.petcare.pojo.User;
import com.example.petcare.service.OrderService;
import com.example.petcare.utils.ThreadLocalUtil;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

@Service
@Slf4j
public class OrderServiceImpl implements OrderService {
    
    @Autowired
    private OrderMapper orderMapper;

    // 查询订单列表（分页查询）
    @Override
    public PageBean<HostDemand> list(Integer pageNum, Integer pageSize, Integer status, Integer orderStatus) {
        // 1.创建PageBean对象
        PageBean<HostDemand> pb = new PageBean<>();

        // 2.开启分页查询     PageHelper
        PageHelper.startPage(pageNum,pageSize);// 返回的是Page对象

        // 3.调用mapper
        Map<String,Object> map = ThreadLocalUtil.get();

        // 在这里获取providerId或adminId
        Integer providerId = (Integer) map.get("ProviderId");
        // 如果是管理员，上面就获取不到providerId，所以再获取一次
        if(providerId == null){
            providerId = (Integer) map.get("AdminId");
        }

        List<HostDemand> list = orderMapper.list(status,orderStatus,providerId);

        // Page中提供了方法，可以获取PageHelper分页查询后 得到的总记录条数和当前页数据
        // 不强转，多肽它是不允许使用父类类型去调用子类特有的方法的，所以需要强转
        Page<HostDemand> p =(Page<HostDemand>) list;// Page是一个List的子类，实现类

        // 把数据填充到PageBean对象中
        pb.setTotal(p.getTotal());
        pb.setItems(p.getResult());

        return pb;
    }

    // 接单,更新订单状态(status)
    @Override
    public void updateStatus(Integer hostId) {

        // 1.查询订单
        HostDemand hostDemand = orderMapper.selectById(hostId);

        // 2. 判断当前状态，避免重复更新
        if (hostDemand.isStatus()) {
            throw new OrderException("订单已被接单，无需重复操作");
        }

        // 3. 判断是否被拒绝
        if (hostDemand.isRejectStatus()) {
            throw new OrderException("订单已被拒绝，无法接单");
        }

        // 3.更新订单状态
        hostDemand.setStatus(true);

        // 把用户订单中的商家id设置为当前登录的商家id
        Map<String,Object> map = ThreadLocalUtil.get();
        Integer providerId = (Integer) map.get("ProviderId");
        // 如果是管理员，上面就获取不到providerId，所以再获取一次
        if(providerId == null){
            providerId = (Integer) map.get("AdminId");
        }
        hostDemand.setProviderId(providerId);

        orderMapper.updateStatus(hostDemand);


    }

    // 完成订单，更新订单状态(orderStatus)
    @Override
    public void updateOrderStatus(Integer hostId) {

        // 1.查询订单
        HostDemand hostDemand = orderMapper.selectById(hostId);


        // 判断是否为空
        if (hostDemand == null) {
            throw new OrderException("请先支付，等待商家接单");
        }


        // 2. 判断status是否为true, 如果不为true, 不能完成订单
        if (!hostDemand.isStatus()) {
            throw new OrderException("订单未被接单，不能完成订单");
        }

        // 3. 判断orderStatus是否为true, 如果为true, 不能重复完成订单
        if (hostDemand.isOrderStatus()) {
            throw new OrderException("订单已完成，无需重复操作");
        }

        // 把订单状态(orderStatus)改为true
        hostDemand.setOrderStatus(true);
        orderMapper.updateOrderStatus(hostDemand);


    }

    // 拒绝订单，更新订单状态(rejectStatus)
    @Override
    public void updateRejectStatus(Integer hostId) {

        // 1.查询订单
        HostDemand hostDemand = orderMapper.selectById(hostId);

        // 2. 判断status是否为true, 如果为true, 不能拒绝订单,为false才能拒绝订单
        if (hostDemand.isStatus()) {
            throw new OrderException("订单已被接单，不能拒绝订单");
        }

        // 3. 判断rejectStatus是否为true, 如果为true, 不能重复拒绝订单
        if (hostDemand.isRejectStatus()) {
            throw new OrderException("订单已被拒绝，无需重复操作");
        }

        // 把订单状态(rejectStatus)改为true
        hostDemand.setRejectStatus(true);

        // 更新订单状态为已完成
        hostDemand.setOrderStatus(true);


        orderMapper.updateRejectStatus(hostDemand);

    }

    // 是否有新订单
    @Override
    public Integer hasNewOrder() {

//        Map<String,Object> map = ThreadLocalUtil.get();
//        Integer providerId = (Integer) map.get("ProviderId");
//        // 如果是管理员，上面就获取不到providerId，所以再获取一次
//        if(providerId == null){
//            providerId = (Integer) map.get("AdminId");
//        }

        return orderMapper.hasNewOrder();

    }

    // 查询用户信息
    @Override
    public User userInfo(Integer hostId) {

        // 先根据hostId查询订单
        HostDemand hostDemand = orderMapper.selectById(hostId);

        // 然后获取userId
        Integer userId = hostDemand.getUserId();

        // 根据userId查询用户信息
        User user = orderMapper.selectUserById(userId);

        // 返回用户信息
        return user;

    }


}
